﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Insifo.WE;
using System.Text.RegularExpressions;
using System.Collections.Specialized;

public partial class genPeriodoAnualEditar : ObjectPage
{
    #region CONSTANTES

    private const string RUTA_LISTA = "~/gen/genPeriodoAnualListar.aspx";

    #endregion

    #region PROPIEDADES

    public WCPeriodoAnual.BEPeriodoAnual PeriodoAnual
    {
        get { return (WCPeriodoAnual.BEPeriodoAnual)ViewState["PeriodoAnual"]; }
        set { ViewState["PeriodoAnual"] = value; }
    }

    #endregion PROPIEDADES

    #region EVENTOS

    protected void Page_Load(object sender, EventArgs e)
    {
        //Eventos del Master
        Master.MenuAccionEvento += new MasterPageMenuEditarClickHandler(Master_MenuButton);
        if (!IsPostBack)
        {            
            Cargar();
        }
    }

    protected void Master_MenuButton(object sender, EventArgs e)
    {
        string strAccion = ((CommandEventArgs)e).CommandName;
        switch (strAccion)
        {
            case "Aceptar":
                Grabar("G");
                break;
            case "Aplicar":
                Grabar("A"); 
                break;
            case "Cancelar":
                Salir();
                break;
        }
    }


    #endregion

    #region METODOS

    protected void Cargar()
    {
        //Instancia regla

        PeriodoAnual = new WCPeriodoAnual.BEPeriodoAnual();
        //Carga Estado
        Util.loadCombo(ddlEstado, ListarParametroDetalle(1, 1, Constantes.PARAMETRO_ESTADOREGISTRO), "Descripcion", "ParametroDetalle");

        lnkGeneral.HRef = string.Format("#{0}", tabGeneral.ClientID);
        lnkDetalle.HRef = string.Format("#{0}", tabDetalle.ClientID);

        //Acciones
        string strAccion =  Request.QueryString["a"];   //a: N-Nuevo, e-Editar, v-Ver
        string strId = Request.QueryString["i"];  //Id

        switch (strAccion)
        {
            case "n":
                Master.SubTitulo.Text =  Resources.resDiccionario.Nuevo;
                Nuevo();
                break;
            case "e":
                Master.SubTitulo.Text = Resources.resDiccionario.Editar;
                Editar(strAccion, strId);
                break;
            case "d":
                Master.SubTitulo.Text = Resources.resDiccionario.Inactivar;
                Editar(strAccion, strId);
                break;
            default:
                Master.SubTitulo.Text = Resources.resDiccionario.Unknow;
                break;
        }
    }

    protected void Nuevo()
    {
        hfIdPeriodoAnual.Value = "0";
        hfAccion.Value = "n"; //Nuevo
        txtPeriodoAnual.Text = string.Empty;

        //Datos de Auditoria
        ddlEstado.SelectedIndex = 0; //Representa el primero
        txtUsuarioCreacion.Text = string.Empty;
        txtFechaCreacion.Text = string.Empty;
        txtUsuarioModificacion.Text = string.Empty;
        txtFechaModificacion.Text = string.Empty;

        //Cargar Periodos
        NuevosPeriodos();
    }

    protected void Editar(string pstrAccion, string pstrIdPeriodoAnual)
    {
        
        WCPeriodoAnual.BEPeriodoAnual be = new WCPeriodoAnual.BEPeriodoAnual
        {
            IdPeriodoAnual = Int32.Parse(pstrIdPeriodoAnual)
        };
        be = ObtenerPeriodoAnual(be);
        this.PeriodoAnual = be;

        hfIdPeriodoAnual.Value = pstrIdPeriodoAnual;
        hfAccion.Value = pstrAccion; //Editar/Eliminarç
        txtPeriodoAnual.Text = be.PeriodoAnual;

        //Datos de Auditoria
        Util.SelectCombo(ddlEstado,be.Estado);
        txtUsuarioCreacion.Text = be.UsuarioCreacion;
        txtFechaCreacion.Text = be.FechaCreacion.ToString(AppSettings.FormatoFechaHora);
        txtUsuarioModificacion.Text = be.UsuarioModificacion;
        txtFechaModificacion.Text = be.FechaModificacion.ToString(AppSettings.FormatoFechaHora);

        if (pstrAccion == "d")
        {
            Master.MenuAplicar.Visible = false; //Remueve el boton aplicar
            ddlEstado.Enabled = false;

            if (be.Estado == Constantes.ESTADO_ACTIVO)
            {
                Util.SelectCombo(ddlEstado, Constantes.ESTADO_INACTIVO);
            }
            else
            {
                Util.SelectCombo(ddlEstado, Constantes.ESTADO_ACTIVO);
            }
        }

        //Cargar Detalle

        ListarPeriodo();
    }

    protected bool Validar(ref WCPeriodoAnual.BEPeriodoAnual pbe )
    {
        string strUsuario = string.Empty, strEstado = string.Empty;
        string strAccion = string.Empty, strPeriodoAnual = string.Empty;

        strAccion = hfAccion.Value; //a: n-Nuevo, e-Editar, v-Ver
        strPeriodoAnual = txtPeriodoAnual.Text.Trim();

        strEstado = ddlEstado.SelectedValue;
        strUsuario = UsuarioSistema.CodigoUsuario;

        ModificarPeriodos();

        //Valida Datos
        if (!ValidarPeriodoAnual())
            return false;

        //Inicializa

        pbe.IdPeriodoAnual  = Int32.Parse(hfIdPeriodoAnual.Value);
        pbe.PeriodoAnual = strPeriodoAnual;
        pbe.Estado = strEstado;
        pbe.UsuarioCreacion = strUsuario;
        pbe.FechaCreacion = DateTime.Now;
        pbe.UsuarioModificacion = strUsuario;
        pbe.FechaModificacion = DateTime.Now;

        return true;
    }


    protected bool ValidarPeriodoAnual()
    {
        string strPeriodo = txtPeriodoAnual.Text.Trim();
        if (strPeriodo.Length != 4)
        {
            Util.ejecutaScriptAJAX(this.Page, string.Format("alert('{0}');", Resources.resMensaje.msgAlertaIngresarAnioCorrecto));
            return false;
        }
        return true;
    }

    protected void Grabar(string pstrEvento) //G:Grabar, A:Aplicar
    {
        string strAccion = string.Empty;
        string strUsuario = string.Empty;

        strAccion = hfAccion.Value; //a: n-Nuevo, e-Editar, v-Ver
        strUsuario = UsuarioSistema.CodigoUsuario;
        ModificarPeriodos();

        WCPeriodoAnual.BEPeriodoAnual be = this.PeriodoAnual;
         
        if (!Validar(ref be)) //Valida e Inicializa
        {
            return;
        }

        
        //Grabar
        switch (strAccion)
        {
            case "n": //Nuevo
                be = InsertarPeriodoAnual(be);
                if (be.Error != 0)
                {
                    Util.ejecutaScriptAJAX(this.Page, string.Format("alert('{0}');", Resources.resMensaje.msgErrorRegistrar));
                }
                hfAccion.Value = "e";
                hfIdPeriodoAnual.Value = be.IdPeriodoAnual.ToString();
                //txtPeriodoAnual.Text = be.PeriodoAnual;
                txtUsuarioCreacion.Text = strUsuario;
                txtFechaCreacion.Text = be.FechaCreacion.ToString(AppSettings.FormatoFechaHora);
                txtUsuarioModificacion.Text = strUsuario;
                txtFechaModificacion.Text = be.FechaCreacion.ToString(AppSettings.FormatoFechaHora);

               
                break;
            case "e": //Actualiza
                be = ActualizarPeriodoAnual(be);                
                txtUsuarioModificacion.Text = strUsuario;
                txtFechaModificacion.Text = be.FechaModificacion.ToString(AppSettings.FormatoFechaHora);

                if (be.Error != 0)
                {
                    Util.ejecutaScriptAJAX(this.Page, string.Format("alert('{0}');", Resources.resMensaje.msgErrorActualizar));
                }
                break;
            case "d": //Elimina
                be = EliminaPeriodoAnual(be);
                txtUsuarioModificacion.Text = strUsuario;
                txtFechaModificacion.Text = be.FechaModificacion.ToString(AppSettings.FormatoFechaHora);

                if (be.Error != 0)
                {
                    Util.ejecutaScriptAJAX(this.Page, string.Format("alert('{0}');", Resources.resMensaje.msgErrorActualizar));
                }
                break;
        }
      if (pstrEvento == "G") {if (be.Error == 0) { Salir();} }
    }

    //protected void hlTab_Click(object sender, EventArgs e)
    //{

    //    int inTabActivo = 0;
    //    LinkButton lkbTab = (LinkButton)sender;
    //    inTabActivo = Int32.Parse(lkbTab.CommandArgument);
    //    mvwEdicion.ActiveViewIndex = inTabActivo;
    //    if (inTabActivo == 1)
    //    {
    //        if (!ValidarPeriodoAnual())
    //            return;
    //        ModificarPeriodos();
    //    }
    //    hlTab00.CssClass = string.Empty;
    //    hlTab01.CssClass = string.Empty;
    //    lkbTab.CssClass = "activar";
    //    hfTabActivo.Value = inTabActivo.ToString();
    //}

    protected void Salir()
    {
        string strCadena = string.Format("?a=l&param1={0}", HttpUtility.UrlDecode(Request.QueryString["param1"]));
        Util.Redireciona(RUTA_LISTA, strCadena, true);
    }


    #endregion



    #region PERIODO

    protected void lvPeriodo_ItemCommand(object sender, ListViewCommandEventArgs e)
    {
        PeriodoOperacion(e.CommandName, e.Item);
    }
    protected void lvPeriodo_ItemDataBound(object sender, ListViewItemEventArgs e)
    {
        BoundPeriodo(e.Item);
    }

    protected void NuevosPeriodos()
    {
        List<WCPeriodoAnual.BEPeriodo> lstPeriodo = new List<WCPeriodoAnual.BEPeriodo>();
        for (int i = 1; i <= 12; i = i + 1)
        {
            WCPeriodoAnual.BEPeriodo be = new WCPeriodoAnual.BEPeriodo()
            {
                IdPeriodoAnual = 0,
                Periodo = i.ToString("00"),
                Vigente = "S",
                Estado = "A",
                RefAccion = WCPeriodoAnual.DbTipoAccion.Insertar,
                RefGuid = Guid.NewGuid().ToString()
            };
            lstPeriodo.Add(be);
        }
        lvPeriodo.DataSource = lstPeriodo;
        lvPeriodo.DataBind();
        this.PeriodoAnual.Periodos = lstPeriodo.ToArray();
    }

    protected void ModificarPeriodos()
    {
        WCPeriodoAnual.BEPeriodoAnual bePer = this.PeriodoAnual;

        string strPeriodo = txtPeriodoAnual.Text.Trim();
        List<WCPeriodoAnual.BEPeriodo> lstPeriodoNuevo = new List<WCPeriodoAnual.BEPeriodo>();
        int intContador = 1;

        foreach (WCPeriodoAnual.BEPeriodo be in bePer.Periodos)
        {
            be.Periodo = strPeriodo + intContador.ToString("00");
            switch (be.RefAccion)
            {
                case WCPeriodoAnual.DbTipoAccion.Insertar:
                    be.RefAccion = WCPeriodoAnual.DbTipoAccion.Insertar;
                    break;
                case WCPeriodoAnual.DbTipoAccion.Actualizar:
                    be.RefAccion = WCPeriodoAnual.DbTipoAccion.Actualizar;
                    break;
            }
            be.UsuarioModificacion = UsuarioSistema.CodigoUsuario;
            be.FechaModificacion = DateTime.Now;
            lstPeriodoNuevo.Add(be);
            intContador = intContador + 1;
        }

        this.PeriodoAnual.Periodos = lstPeriodoNuevo.ToArray();
        lvPeriodo.DataSource = lstPeriodoNuevo;
        lvPeriodo.DataBind();
    }

    protected void ListarPeriodo()
    {
        //Obtiene los Periodo
        WCPeriodoAnual.BEPeriodoAnual be = this.PeriodoAnual;
        WCPeriodoAnual.BEPeriodo[] arrNuevo = null;

        if (be.Periodos != null)
        {
            arrNuevo = be.Periodos;
        }
        lvPeriodo.DataSource = arrNuevo;
        lvPeriodo.DataBind();
    }

    protected void PeriodoOperacion(string pstrComando, ListViewItem plviObj)
    {
        switch (pstrComando)
        {
            case Constantes.ACCION_EDITAR:
                EditarPeriodo(plviObj);
                break;
            case Constantes.ACCION_GRABAR:
                GrabarPeriodo(plviObj);
                break;
            case Constantes.ACCION_CANCELAR:
                CancelarPeriodo();
                break;
        }
    }

    protected void GrabarPeriodo(ListViewItem plceArg)
    {
        //Obtiene lo ultimo obtenido 
        WCPeriodoAnual.BEPeriodoAnual bePeriodo = this.PeriodoAnual;

        //Obtiene los valres ingresados
        HiddenField hfPeriodoEditIdPeriodo = (HiddenField)plceArg.FindControl("hfPeriodoEditIdPeriodo");
        HiddenField hfPeriodoEditRefGuid = (HiddenField)plceArg.FindControl("hfPeriodoEditRefGuid");
        TextBox txtPeriodoEditPeriodo = (TextBox)plceArg.FindControl("txtPeriodoEditPeriodo");
        CheckBox cbPeriodoEditVigente = (CheckBox)plceArg.FindControl("cbPeriodoEditVigente");
        DropDownList ddlPeriodoEditEstado = (DropDownList)plceArg.FindControl("ddlPeriodoEditEstado");

        WCPeriodoAnual.BEPeriodo be = new WCPeriodoAnual.BEPeriodo
        {
            IdPeriodoAnual = bePeriodo.IdPeriodoAnual,
            Periodo = txtPeriodoEditPeriodo.Text.Trim(),
            Estado = ddlPeriodoEditEstado.SelectedValue,
            Vigente = (cbPeriodoEditVigente.Checked ? "S" : "N"),
            UsuarioCreacion = UsuarioSistema.CodigoUsuario,
            FechaCreacion = DateTime.Now,
            UsuarioModificacion = UsuarioSistema.CodigoUsuario,
            FechaModificacion = DateTime.Now,
            RefAccion = hfPeriodoEditIdPeriodo.Value == "0" ? WCPeriodoAnual.DbTipoAccion.Insertar : WCPeriodoAnual.DbTipoAccion.Actualizar
        };

        int inInd = Array.FindIndex(bePeriodo.Periodos, o => o.RefGuid == hfPeriodoEditRefGuid.Value);
        this.PeriodoAnual.Periodos[inInd] = be; //Reemplaza un objeto
        lvPeriodo.EditIndex = -1;

        // Cancela el modo de Insersion
        CancelarPeriodoModoInsertar();

        // Listar el Periodo de Salida
        ListarPeriodo();
    }

    protected void EditarPeriodo(ListViewItem plceArg)
    {
        lvPeriodo.EditIndex = plceArg.DataItemIndex;
        // Listar Periodo
        ListarPeriodo();
    }

    protected void CancelarPeriodo()
    {
        lvPeriodo.EditIndex = -1;
        CancelarPeriodoModoInsertar();
        // Listar Periodos
        ListarPeriodo();
    }

    protected void BoundPeriodo(ListViewItem plceArg)
    {
        if (plceArg.ItemType == ListViewItemType.DataItem)
        {
            if (plceArg.DataItemIndex == lvPeriodo.EditIndex)
            {
                HiddenField hfPeriodoEditEstado = (HiddenField)plceArg.FindControl("hfPeriodoEditEstado");
                DropDownList ddlPeriodoEditEstado = (DropDownList)plceArg.FindControl("ddlPeriodoEditEstado");
                if (ddlPeriodoEditEstado != null)
                {
                    Util.SelectCombo(ddlPeriodoEditEstado, hfPeriodoEditEstado.Value);
                }
            }
            else
            {
                HiddenField hfPeriodoItemEstado = (HiddenField)plceArg.FindControl("hfPeriodoItemEstado");
                DropDownList ddlPeriodoItemEstado = (DropDownList)plceArg.FindControl("ddlPeriodoItemEstado");
                if (ddlPeriodoItemEstado != null)
                {
                    Util.SelectCombo(ddlPeriodoItemEstado, hfPeriodoItemEstado.Value);
                }
            }
        }
    }

    protected void CancelarPeriodoModoInsertar()
    {
        lvPeriodo.InsertItemPosition = InsertItemPosition.None;
    }

    #endregion TAB PERIODO

    

    #region LLAMDAS A WEBSERVICES

    /// <summary>
    /// Método Lista Niveles de Alerta
    /// </summary>
    /// <returns>Devuelve un DataSet</returns>
    protected WCPeriodoAnual.BEPeriodoAnual InsertarPeriodoAnual(WCPeriodoAnual.BEPeriodoAnual pbe)
    {
        WCPeriodoAnual.BEPeriodoAnual be = new WCPeriodoAnual.BEPeriodoAnual();
        DataTable dt = new DataTable();
        using (var client = new ServiceClient<WCPeriodoAnual.IWCPeriodoAnual>("BasicHttpBinding_IWCPeriodoAnual"))
        {
            var response = client.ServiceOperation<WCPeriodoAnual.BEPeriodoAnual>(
               c => c.Insertar(pbe)
               );
            ;
            be = response;
        }
        return be;
    }

    /// <summary>
    /// Método Obtiene Nivel de Alerta
    /// </summary>
    /// <returns>Devuelve un Objeto</returns>
    protected WCPeriodoAnual.BEPeriodoAnual ObtenerPeriodoAnual(WCPeriodoAnual.BEPeriodoAnual pbe)
    {
        WCPeriodoAnual.BEPeriodoAnual be = new WCPeriodoAnual.BEPeriodoAnual();
        DataTable dt = new DataTable();
        using (var client = new ServiceClient<WCPeriodoAnual.IWCPeriodoAnual>("BasicHttpBinding_IWCPeriodoAnual"))
        {
            var response = client.ServiceOperation<WCPeriodoAnual.BEPeriodoAnual>(
               c => c.Obtener(pbe)
               );
            ;
            be = response;
        }
        return be;
    }

    /// <summary>
    /// Método Actualiza un Nivele de Alerta
    /// </summary>
    /// <returns>Devuelve un DataSet</returns>
    protected WCPeriodoAnual.BEPeriodoAnual ActualizarPeriodoAnual(WCPeriodoAnual.BEPeriodoAnual pbe)
    {
        WCPeriodoAnual.BEPeriodoAnual be = new WCPeriodoAnual.BEPeriodoAnual();
        DataTable dt = new DataTable();
        using (var client = new ServiceClient<WCPeriodoAnual.IWCPeriodoAnual>("BasicHttpBinding_IWCPeriodoAnual"))
        {
            var response = client.ServiceOperation<WCPeriodoAnual.BEPeriodoAnual>(
               c => c.Actualizar(pbe)
               );
            ;
            be = response;
        }
        return be;
    }

    /// <summary>
    /// Método Elimina un Nivele de Alerta
    /// </summary>
    /// <returns>Devuelve un DataSet</returns>
    protected WCPeriodoAnual.BEPeriodoAnual EliminaPeriodoAnual(WCPeriodoAnual.BEPeriodoAnual pbe)
    {
        WCPeriodoAnual.BEPeriodoAnual be = new WCPeriodoAnual.BEPeriodoAnual();
        DataTable dt = new DataTable();
        using (var client = new ServiceClient<WCPeriodoAnual.IWCPeriodoAnual>("BasicHttpBinding_IWCPeriodoAnual"))
        {
            var response = client.ServiceOperation<WCPeriodoAnual.BEPeriodoAnual>(
               c => c.Eliminar(pbe)
               );
            ;
            be = response;
        }
        return be;
    }

    /// <summary>
    /// Método Lista Companias
    /// </summary>
    /// <returns>Devuelve un dataTable</returns>
    protected DataTable ListarCompanias()
    {
        WCCompania.BECompania be = new WCCompania.BECompania() { Descripcion = string.Empty, Estado = "A" };
        DataTable dt = new DataTable();
        using (var client = new ServiceClient<WCCompania.IWCCompania>("BasicHttpBinding_IWCCompania"))
        {
            var response = client.ServiceOperation<DataTable>(
               c => c.Listar_Sel(be).Tables[0]
               );
            ;
            dt = response;
        }
        return dt;
    }



    /// <summary>
    /// Método Lista Companias
    /// </summary>
    /// <returns>Devuelve un dataTable</returns>
    protected DataTable ListarPeriodoAnual()
    {
        WCPeriodoAnual.BEPeriodoAnual be = new WCPeriodoAnual.BEPeriodoAnual();
        be.Descripcion = "";
        be.Estado = "A";
        be.Pagina = 0;
        DataTable dt = new DataTable();
        using (var client = new ServiceClient<WCPeriodoAnual.IWCPeriodoAnual>("BasicHttpBinding_IWCPeriodoAnual"))
        {
            var response = client.ServiceOperation<DataTable>(
               c => c.Listar(be).Tables[0]
               );
            ;
            dt = response;
        }
        return dt;
    }

    /// <summary>
    /// Método Lista Companias
    /// </summary>
    /// <returns>Devuelve un dataTable</returns>
    protected DataTable ListarParametroDetalle(int pintidCompania, int pintIdAplicacion, string pstrParametro)
    {
        WCParametroDetalle.BEParametroDetalle be = new WCParametroDetalle.BEParametroDetalle();
        be.IdCompania = pintidCompania;
        be.IdAplicacion = pintIdAplicacion;
        be.Parametro = pstrParametro;
        DataTable dt = new DataTable();
        using (var client = new ServiceClient<WCParametroDetalle.IWCParametroDetalle>("BasicHttpBinding_IWCParametroDetalle"))
        {
            var response = client.ServiceOperation<DataTable>(c => c.Listar(be).Tables[0]);
            dt = response;
        }
        return dt;
    }
    #endregion

}